package p.ithorns.framework.crypto.core;

import org.springframework.core.MethodParameter;
import p.ithorns.framework.crypto.annotation.Decrypt;
import p.ithorns.framework.crypto.annotation.Encrypt;

import java.lang.reflect.Method;

/**
 * NeedCrypto
 *
 * @author ithorns
 * @version 1.0
 * @date 2019/5/24 10:49
 */
public class NeedCrypto {

    private  NeedCrypto(){}

    /**
     * 是否需要对结果加密
     * 1.类上标注或者方法上标注,并且都为true
     * 2.有一个标注为false就不需要加密
     */
    public static boolean needEncrypt(MethodParameter parameter) {
        if (parameter == null) { return false; }
        boolean encrypt = false;
        // 类注解 优先处理类注解内容，类加密，所有方法都加密，反之。
        Class clazz = parameter.getContainingClass();
        if (clazz.isAnnotationPresent(Encrypt.class)) {
            encrypt = ((Encrypt) clazz.getAnnotation(Encrypt.class)).value();
            if (!encrypt)  {
                return false;
            }
        }

        // 方法注解
        Method method = parameter.getMethod();
        if (method != null && method.isAnnotationPresent(Encrypt.class)) {
            encrypt = ((Encrypt) method.getAnnotation(Encrypt.class)).value();
        }
        return encrypt;
    }

    /**
     * 是否需要参数解密
     * 1.类上标注或者方法上标注,并且都为true
     * 2.有一个标注为false就不需要解密
     */
    public static boolean needDecrypt(MethodParameter parameter) {
        if (parameter == null) { return false; }
        boolean decrypt = false;
        // 类注解 优先处理类注解内容，类加密，所有方法都加密，反之。
        Class clazz = parameter.getContainingClass();
        if (clazz.isAnnotationPresent(Decrypt.class)) {
            decrypt = ((Decrypt) clazz.getAnnotation(Decrypt.class)).value();
            if (!decrypt)  {
                return false;
            }
        }

        // 方法注解
        Method method = parameter.getMethod();
        if (method != null && method.isAnnotationPresent(Decrypt.class)) {
            decrypt = ((Decrypt) method.getAnnotation(Decrypt.class)).value();
        }

        return decrypt;
    }

}
